package com.xyf.controller;

//import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.xyf.pojo.ProductInfo;
import com.xyf.service.ProductInfoService;
import com.xyf.utils.FileNameUtil;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/prod")
public class ProductInfoAction {

    public static final int PAGE_SIZE = 5;
    String saveFileName = "";

    @Autowired
    ProductInfoService productInfoService;
    // 显示全部商品不分页
    @RequestMapping("/getAll")
    public String getAll(HttpServletRequest request){
        List<ProductInfo> list = productInfoService.getAll();
        request.setAttribute("list",list);

        return "product";
    }

    @RequestMapping("/split")
    public String split(HttpServletRequest request){
        // 得到第一页的数据
        PageInfo info = productInfoService.splitPage(1,PAGE_SIZE);
        request.setAttribute("info",info);

        return "product";
    }


//    ajax分页翻页处理
    @ResponseBody
    @RequestMapping("/ajaxsplit")
    public void ajaxsplit(int page, HttpSession session){
        // 取得当前page参数的页面的数据
        PageInfo info = productInfoService.splitPage(page,PAGE_SIZE);
        session.setAttribute("info",info);
    }

//    异步ajax文件上传处理
    @ResponseBody
    @RequestMapping("/ajaxImg")
    public Object ajaxImg(MultipartFile pimage, HttpServletRequest request){  // MultipartFile接收上传的图片
        // 提取生成文件名UUID+上传图片的后缀 .jpg  .png
        saveFileName = FileNameUtil.getUUIDFileName() + FileNameUtil.getFileType(pimage.getOriginalFilename());
        // 得到项目中图片存储的路径

//        转存
        try {
            String path = request.getServletContext().getRealPath("/image_big");
            pimage.transferTo(new File(path + File.separator + saveFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 返回客户端json对象,封装图片路径，为了在页面实现立即回显
        JSONObject object = new JSONObject();
        object.put("imgurl",saveFileName);
        System.out.println(object.toString());

        return object.toString();
    }
    // 增加商品
    @RequestMapping("/save")
    public String save(ProductInfo info, HttpServletRequest request){
        info.setpImage(saveFileName);
        info.setpDate(new Date());

        int num = -1;
        try{
            num = productInfoService.save(info);
        }catch (Exception e){
            e.printStackTrace();
        }
        if(num>0){
            request.setAttribute("msg","增加成功！");
        }else {
            request.setAttribute("msg","增加失败！");
        }
        // 清空saveFileName变量中的内容，为了下次增加或修改的异步ajax的上传处理
        saveFileName = "";
        // 增加成功后应该重新访问数据库，所以跳转到分页显示的action上
        return "forward:/prod/split.action";
    }

    // 按主键id查询商品
    @RequestMapping("/one")
    public String one(int pid, Model model){

        ProductInfo info = productInfoService.getById(pid);
        // 将数据库查到的数据封装到model里
        model.addAttribute("prod",info);
        return "update";
    }

    @RequestMapping("/update")
    public String update(ProductInfo info,HttpServletRequest request){
        // 因为ajax的异步图片上传，如果有上传，
        // 则saveFileName 里有上传上来的图片的名称，
        // 如果没有使用异步ajax上传过图片，则saveFileName="",
        // 实体类info使用隐藏表单域提供上来的pImage原始图片的名称；
        if(!saveFileName.equals("")){
            info.setpImage(saveFileName);
        }
        // 完成更新操作
        int num = -1;
        try {
            num = productInfoService.update(info);
        }catch (Exception e){
            e.printStackTrace();
        }
        if(num>0){
            // 此时说明更新成功
            request.setAttribute("msg","更新成功！");
        }else{
            //更新失败
            request.setAttribute("msg","更新失败！");
        }

        // 处理完更新后，saveFileName里有可能有数据，
        // 而下一次更新时要使用这个变量作为依据，就会出错，所以必须清空saveFileName.
        saveFileName = "";
        return "redirect:/prod/split.action";
    }
}

